<?php
namespace app\index\controller;
use app\api\model\My as MyModel;
use app\index\model\Choujiang as ChoujiangModel;
use app\index\model\Settlement as SettlementModel;
use think\Controller;
use think\Cache;
use think\Db;
/**
 * 抽奖类
 * @author 向克鑫
 */
class Choujiang extends Auth
{
    static private $prize = '';

    protected function _initialize()
    {    
        parent::_initialize();
        /* 
         * 奖项数组 
         * 是一个二维数组，记录了所有本次抽奖的奖项信息， 
         * 其中id表示中奖等级，prize表示奖品，v表示中奖概率。 
         * 注意其中的v必须为整数，你可以将对应的 奖项的v设置成0，即意味着该奖项抽中的几率是0， 
         * 数组中v的总和（基数），基数越大越能体现概率的准确性。 
         * 本例中v的总和为100，那么平板电脑对应的 中奖概率就是1%， 
         * 如果v的总和是10000，那中奖概率就是万分之一了。 
         *  
         */
        $this->MyModel = new MyModel;
        $this->user =  $this->MyModel->my_info($this->wxuser['uid']);       
        $this->prize_arr = Cache::get('prize');
        if(!$this->prize_arr){
             $this->prize_arr = Db::name('prize')->order('sort asc')->select();   
             Cache::set('prize',$this->prize_arr,3600);   
        }
    }

    //大转盘首页
    public function index(){ 
       session('choujiang_auth',getRandomString(10));
       $prize = array();
       foreach ($this->prize_arr as $key => $value) {
          $prize[] = $value['prize']; 
       }
       $this->assign([
            'choujiang_auth'  => session('choujiang_auth'),
            'prize_arr'=>json_encode($prize,JSON_UNESCAPED_UNICODE),
            'money'=>$this->user['bonus'],
            'headimgurl'=>$this->wxuser['headimgurl'],
       ]); 
       return $this->fetch();      
    }
    
    //获取抽奖结果
    public function cj(){
        $auth = input('param.auth');
        if($auth!=session('choujiang_auth')){
           return json(array('code'=>1,'error'=>'非法请求'));
        }  
        $consume = $this->user['bonus']; //消耗金额
        $order = date('YmdHis').rand(100000,999999); //订单号

        if($consume<1){
            return json(array('code'=>1,'error'=>'您的补贴还未达到1.00，赶紧再去买买买吧'));
        }
        //抽奖结果
        $res = $this->cjjg($this->prize_arr);
        /*再来一次*/
        if($res['type']==0){
            $choujiang_auth = getRandomString(10); 
            session('choujiang_auth',$choujiang_auth); 
            return json(array('code'=>0,'result'=>$res,'consume'=>0,'auth'=>$choujiang_auth));
        }
        /*手机话费*/
        if($res['type']==2){
           $consume = $res['consume'];/*话费金额*/
        }     
        //扣除用户补贴金额
        $row1 = $this->MyModel->setmoney($this->user['uid'],$consume,2,1);
        if(!$row1){
            return json(array('code'=>101,'error'=>'抽奖失败'));
        }
        //写入用户补贴日志
        $this->MyModel->finance_insert(['uid'=>$this->user['uid'],'money'=>$consume,'type'=>2,'rank'=>1,'orderid'=>$order]);

        // 写入抽奖记录          
        $data = array('openid' => $this->wxuser['openid'],
                      'money' => $consume,
                      'consume' => $consume,
                      'addtime' => time(),
                      'type' => $res['type'],
                      'cid' => $res['id']
               );
        $cid = Db::name('choujiang')->insertGetId($data); 

    		/*红包*/
    		if($res['type']==1){
    			$order = date('YmdHis').rand(100000,999999);
    			//写入提现记录 
          $Settlement = new SettlementModel;   
          $Settlement->data([
              'openid'=> $this->wxuser['openid'],
              'cid'  =>  $cid,
              'order' =>  $order,
              'money' => $consume,
              'type' => 1
          ]);
          $Settlement->save();     
    			//写入机器人用户提现记录
          $Extract = model('Extract');
          $Extract->data([
              'uid'  =>  $this->user['uid'],
              'number' =>  $order,
              'money' => $consume,
              'type' => 1
          ]);
          $Extract->isUpdate(false)->save(); 
    		  $res['order'] = $order;
    			$res['time'] = time();
    			$res['sign'] = md5($res['time']. $res['order'].'5E01B19E71B351F05C5D5B08D06238AA');
    		}
        $choujiang_auth = getRandomString(10); 
        session('choujiang_auth',$choujiang_auth);           
        return json(array('code'=>0,'result'=>$res,'cid'=>$cid,'consume'=>$consume,'auth'=>$choujiang_auth));
    }
    
    /*抽奖后获取用户输入的信息并发放相关奖励*/
    public function confirm(){
           /*type 1为红包，2为集分宝，3为话费*/
           $id = input('post.cid',0);
           $alipay = input('post.alipay');
           $phone = input('post.phone');
           $auth = input('post.auth');
           if($auth!=session('choujiang_auth')){
              return json(array('code'=>1,'error'=>'非法请求'));
           }
           /*抽奖记录*/
           $dd = Db::name('choujiang')->where(array('id'=>$id,'openid'=>$this->wxuser['openid']))->find();
           if(!$dd){
             return json(array('code'=>1,'error'=>'参数错误'));
           }

           /*现金红包*/
           if($dd['type']==1){
                $Settlement = new SettlementModel;
                $row = $Settlement->where(array('cid'=>$id))->find();
                if($row){
                   return json(array('code'=>0,'msg'=>'礼包已发放。'));
                }
                $order = date('YmdHis').rand(100000,999999);
                 //写入提现记录
                $data1 = array('openid' => $this->wxuser['openid'],
                               'cid' => $id,
                               'order' => $order, //订单号,
                               'money' => $dd['money'],
                               'addtime' => time(),
                               'payment' => 0,
                               'type' => 1
                         );     
                $row = Db::name('settlement')->insert($data1);
                //写入机器人用户提现记录
                $Extract = model('Extract');
                $Extract->data([
                    'uid'  =>  $this->user['uid'],
                    'number' =>  $order,
                    'money' => $dd['money'],
                    'type' => 1
                ]);
                $Extract->isUpdate(false)->save(); 
                 //自动微信汇款结算
                if(config('weixinpay') && $row){
                      if($row['payment']==0){
                          $Wxapi = \think\Loader::model('Wxpay','logic');
                          $ret = $Wxapi->hongbao($data1);
                          if($ret['return_code']=="SUCCESS"){
                             //更新支付状态为已支付
                             $Settlement->save(['payment' => 1],['order' => $data1['order']]);
                             //更新机器人提现记录为成功
                             $Extract->save(['status' => 1],['number' => $order]);
                             return json(array('code'=>0,'msg'=>'礼包已发放，请到微信首界面查收，谢谢。'));
                          }else{
                             return json(array('code'=>0,'msg'=>'礼包已发放，如24小时内未收到礼包，请联系客服。'));
                          }
                       }else{
                          return json(array('code'=>0,'msg'=>'礼包已发放。'));
                       }              
                }else{
                    return json(array('code'=>0,'msg'=>'礼包已发放，请到微信首界面查收,如24小时内未收到礼包，请联系客服。'));
                }  
           }
           /*集分宝*/
           if($dd['type']==2){
               if(empty($alipay)){
                   return json(array('code'=>1,'error'=>'请输入支付宝帐号！'));
                   /*业务逻辑*/
               }
           }
           /*话费*/
           if($dd['type']==3){
               if(empty($phone)){
                   return json(array('code'=>1,'error'=>'请输入手机号码！'));
               }
               $row2 = Db::name('czjl')->where(array('cid'=>$id))->find();
               if(!$row2){
                   $data['cid'] = $id;
                   $data['order'] = date('YmdHis').rand(100000,999999); //订单号
                   $data['phone'] = $phone;
                   $data['money'] = intval($dd['money']);
                   $data['addtime'] = time();
                   $data['payment'] = 0;
                   $row3 = Db::name('czjl')->insert($data);
                   if($row3){
                      $ret = $this->sjcz($data);
                      if($ret['return_code']=="SUCCESS"){  
                         return json(array('code'=>0,'msg'=>'充值成功，话费在24小时内到帐，请留意短信通知。'));
                      }else{
                         return json(array('code'=>1,'msg'=>$ret['msg']));
                      }
                   }else{
                       return json(array('code'=>1,'msg'=>'提交失败，请联系客服处理'));
                   }
               }else{
                   return json(array('code'=>1,'msg'=>''));
               }            
           }
    }
     

    /* 
     * 经典的概率算法， 
     * $proArr是一个预先设置的数组， 
     * 假设数组为：array(100,200,300，400)， 
     * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内，  
     * 如果不在，则将概率空间，也就是k的值减去刚刚的那个数字的概率空间， 
     * 在本例当中就是减去100，也就是说第二个数是在1，900这个范围内筛选的。 
     * 这样 筛选到最终，总会有一个数满足要求。 
     * 就相当于去一个箱子里摸东西， 
     * 第一个不是，第二个不是，第三个还不是，那最后一个一定是。 
     * 这个算法简单，而且效率非常 高， 
     * 关键是这个算法已在我们以前的项目中有应用，尤其是大数据量的项目中效率非常棒。 
     */  
    private function get_rand($proArr) {   
        $result = '';    
        //概率数组的总概率精度   
        $proSum = array_sum($proArr);    
        //概率数组循环   
        foreach ($proArr as $key => $proCur) {   
            $randNum = mt_rand(1, $proSum);   
            if ($randNum <= $proCur) {   
                $result = $key;
                break;   
            } else {   
                $proSum -= $proCur;   
            }         
        }   
        unset ($proArr);    
        return $result;   
    } 
    
    private function getrand($arr){
       for ($i=0; $i < 100; $i++) { 
            $rid = $this->get_rand($arr); //根据概率获取奖项id
            /*结果为手机话费*/
            if(self::$prize[$rid]['type']==2){
                 if($this->user['money']>=30){
                    $result = array('id'=>$rid,'consume'=>30);
                    break;
                 }else if($user['money']>=20){
                    $result = array('id'=>$rid,'consume'=>20);
                    break;
                 }else if($user['money']>=10){
                    $result = array('id'=>$rid,'consume'=>10);
                    break;
                 }
            }else{
               $result = array('id'=>$rid,'consume'=>0);
               break;
            } 
        }
        return $result;        
    }

    //计算抽奖结果
    private function cjjg($prize_arr){
        /* 
         * 每次前端页面的请求，PHP循环奖项设置数组， 
         * 通过概率计算函数get_rand获取抽中的奖项id。 
         * 将中奖奖品保存在数组$res['yes']中， 
         * 而剩下的未中奖的信息保存在$res['no']中， 
         * 最后输出json个数数据给前端页面。 
         */
        $prize = []; 
        $itme = []; 
        foreach ($prize_arr as $key => $val) {   
            $arr[$val['id']] = $val['ratio']; 
            self::$prize[$val['id']] = array('id'=>$val['id'],'prize'=>$val['prize'],'type'=>$val['type'],'sort'=>$val['sort']);  
        }   
        $rs = $this->getrand($arr); //根据概率获取奖项id
        $rid = $rs['id'];
        $consume = $rs['consume'];
        $res = array('id'=>self::$prize[$rid]['id'],'item'=>self::$prize[$rid]['sort'],'prize'=>self::$prize[$rid]['prize'],'type'=>self::$prize[$rid]['type'],'consume'=>$consume); //中奖项    
        return $res;
    } 

}
